#pragma once

#include <algorithm>
#include <cctype>
#include <string>
#include <vector>
#include <set>
#include <fstream>
#include <iostream>
#include <cppjieba/Jieba.hpp>
#include <utfcpp/utf8.h>
#include <sstream>
#include "TextUtils.h"
#include "Message.h"
#include <regex>
#include "Document.h"

using std::ifstream;
using std::vector;
using std::string;
using std::set;
using std::endl;
using std::cout;
using std::cerr;
using std::ostringstream;
using std::streamoff;
using std::regex;
using std::smatch;

// 单词转小写
void to_lower_case(string& s);

// 原地去除字符串的首尾空白
void trim_inplace(string &s);

// 对数据进行清洗, 去除数字和标点符号, 将字母统一转换成小写
void clean_and_normalize(vector<string>& result);

// 判断是否为停用词
bool isStopWord(const string& word, const set<string>& stopWords);

//判断是否为中文字符
bool isChineseChar(char32_t cp);

// 判断是否可以为keyWord
bool isValidKeyWord(string &word, const set<string>& isStopWord);

// 生成停用词集合
void generate_stopwords(const string& dir, set<string>& stopwords);

// 使用正则表达式提取标签内容
// 匹配 <tag>CONTENT</tag>
string extract_tag_content(const string& xml_content, const string& tag_name);

// 从page_library.dat读取指定位置的内容
Document get_document(ifstream& ifs, streamoff start_pos, streamoff length);

// 过滤非中文或包含非中文的词
bool is_all_non_chinese(const string& word);